home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / dev / cross / ava-0.2.5.lha / ava-0.2.5 / src / Syntax.h < prev   
Encoding:
C/C++ Source or Header  |  1999-03-23  |  3.3 KB  |  122 lines

  1. /*
  2.     Syntax.h
  3.     Uros Platise, Dec. 1998
  4. */
  5.  
  6. #ifndef __Syntax
  7. #define __Syntax
  8.  
  9. #include <stack>
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <assert.h>
  13. #include "Global.h"
  14. #include "Lexer.h"
  15.  
  16. /* Operator Magic Number    Mnemonic */
  17. #define OP_NOP        0    /*    */
  18. #define OP_PLUS        1    /* +  */
  19. #define OP_MINUS    2    /* -  */
  20. #define OP_ASL        3    /* <  */
  21. #define OP_ASR        4    /* >  */
  22. #define OP_LAND        5    /* &  */
  23. #define OP_LOR        6    /* |  */
  24. #define OP_LXOR        7    /* ^  */
  25. #define OP_MUL        8    /* *  */
  26. #define OP_DIV        9    /* /  */
  27. #define OP_LE        10    /* <  */
  28. #define OP_GR        11    /* >  */
  29. #define OP_EQ        12    /* == */
  30. #define OP_LEQ        13    /* <= */
  31. #define OP_GEQ        14    /* >= */
  32.  
  33. #define OP_PERIOD    15
  34.  
  35. #define MAX_ARG        128
  36. #define MAX_EQLEN    8000    /* max length in its original form
  37.                    without spaces ... */
  38.                   
  39. /* Type: General Argument Structure */
  40. class TGAS{
  41. private:
  42.   struct TGAE {            /* Type: General Argument Entry */
  43.     char symbol [LX_STRLEN];
  44.     long lval;
  45.   }; 
  46.   enum TOAM{NotDefined, Operator, Argument};
  47.   
  48.   static int OP_LEVEL[OP_PERIOD];
  49.   
  50.   TGAE GAS[MAX_ARG];        /* General Argument Stack */
  51.   unsigned int GOS[MAX_ARG];    /* General Operand Stack */
  52.   unsigned int ai, oi;        /* Argument and Operand Indexes */
  53.   unsigned int aip, oip;  
  54.   TOAM oam;    /* Operator/Argument Mode (which was last pushed?) */
  55.   
  56. public:
  57.   enum TStatus{Parsing,CannotSolve,Solved};
  58.   TStatus status;
  59.   char eqstr [MAX_EQLEN];
  60.   int eqlen;
  61.   TGAS(): ai(0), oi(0), aip(0), oip(0), oam(NotDefined), status(Parsing){
  62.     eqstr[0]=eqlen=0;}    
  63.   void clear (){ai=oi=aip=oip=eqlen=eqstr[0]=0;oam=NotDefined;status=Parsing;}
  64.   
  65.   void push_arg (const char* symbol){ 
  66.     assert(ai<MAX_ARG); 
  67.     GAS[ai].lval=0; strcpy(GAS[ai++].symbol, symbol); oam=Argument;
  68.     eqlen+=strlen(symbol); assert(eqlen<MAX_EQLEN); strcat(eqstr, symbol); 
  69.     status=CannotSolve;/*Whenever symbol is pushed, expr. cannot be solved!*/
  70.   }
  71.   void push_arg (const char* symbol,long lval){
  72.     assert(ai<MAX_ARG); 
  73.     GAS[ai].lval=lval; GAS[ai++].symbol[0]=0; oam=Argument;
  74.     eqlen+=strlen(symbol); assert(eqlen<MAX_EQLEN); strcat(eqstr, symbol);
  75.   }
  76.   void push_op (int op, const char* symbol){ 
  77.     evaluate(op);    /* Evaluate as much as possible */
  78.     assert(oi<MAX_ARG); GOS[oi++]=op; strcat(eqstr,symbol); oam=Operator;    
  79.   }
  80.   void push_eqstr(const char* symbol){
  81.     strcat(eqstr,symbol);
  82.     if (symbol[0]=='('){oam=NotDefined;}
  83.   }
  84.   
  85.   long pop_arg (){assert(ai>0); return GAS[--ai].lval;}    
  86.   int pop_op (){assert(oi>0); return GOS[--oi];}
  87.   
  88.   int wasArgument(){return oam==Argument;}
  89.   int wasOperator(){return oam==Operator;}
  90.   int wasNotDefined(){return oam==NotDefined;}
  91.   
  92.   void evaluate(int new_op);
  93.   void update_argstack(long lval){
  94.     assert(ai<MAX_ARG); GAS[ai].lval=lval; GAS[ai++].symbol[0]=0;}
  95.     
  96.   long result(){return GAS[0].lval;}
  97. };
  98.  
  99. extern TGAS gas;
  100.  
  101. class TSyntax{
  102. public:
  103.   TMicroStack<bool> ifdef_stack;
  104.   bool ifdef_status;    /*parse all code (true) or just wait for #endif*/
  105.   bool HaltOnInvalid;    /*halt on invalid/unknown macros */
  106.   bool firstDefine;
  107. public:
  108.   TSyntax():ifdef_status(true),HaltOnInvalid(false),firstDefine(true){}
  109.   ~TSyntax(){}
  110.  
  111.   void haltOnInvalidMacros(bool confirm=true){HaltOnInvalid=confirm;}
  112.   
  113.   void Run();  
  114.   void Preprocessor();
  115.   char* Parse_FileName(char* buf);
  116.   void Parse_GAS(int argNo=1);  
  117. };
  118.  
  119. extern TSyntax syntax;
  120.  
  121. #endif
  122.